/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package persistencia;

import java.util.List;
import modelo.HibernateUtil;
import org.hibernate.Session;
import org.hibernate.Transaction;
import pojos.Articulos;
import pojos.Cliente;
import pojos.Empleados;
import pojos.Lineasped;
import pojos.Pedido;
import pojos.Proveedor;

/**
 *
 * @author Alejandrolpz
 */
public class PedidosDAO {
    
    private Session sesion;//ESTABLECE UNA SESION CON LA BASE DE DATOS
    private Transaction transaccion;//EJECUTA LAS SENTENCIAS (PARECIDO A STATMENT)
    
    //ABRE UNA NUEVA SESION CON LA BASE DE DATOS
     private void iniciarConexionConBBDD()
    {
        sesion=HibernateUtil.getSessionFactory().openSession();//ABRIMOS UNA SESION
        transaccion=sesion.beginTransaction();//ARRANCA LA TRANSACCION
    }
    
    /**
     * ESTE METODO DEVUELVE TODOS LOS EMPLEADOS DE LA BASE DE DATOS QUE SON ADMINISTRATIVOS
     * @return List<Empleados>
     */
    public List<Empleados> getAdministrativos()//METODO PROBADO, FUNCIONA CORRECTAMENTE
    {
        List<Empleados> listaAdministrativos;
        
        iniciarConexionConBBDD();
        listaAdministrativos=sesion.createQuery("FROM Empleados WHERE tipoempleado.idTipoEmple=1").list();
        sesion.close();
         
        return listaAdministrativos;
    }
    
    /**
     * ESTE METODO DEVUELVE UNA LISTA CON TODOS LO PROVEEDORES DE LA BASE DE DATOS
     * @return List<Proveedor>
     */
    public List<Proveedor> getProveedores()//METODO PROBADO, FUNCIONA CORRECTAMENTE
    {
        List<Proveedor> listaProveedores;
        iniciarConexionConBBDD();
        listaProveedores=sesion.createQuery("FROM Proveedor").list();
        sesion.close();
        
        return listaProveedores;       
    }
    
    /**
     * ESTE METODO DEVUELVE UNA LISTA CON TODOS LOS CLIENTES DE LA BASE DE DATOS
     * @return List<Cliente>
     */
    public List<Cliente> getClientes()//METODO PROBADO, FUNCIONA CORRECTAMENTE
    {
        List<Cliente> listaClientes;
        iniciarConexionConBBDD();
        listaClientes=sesion.createQuery("FROM Cliente").list();
        sesion.close();
        
        return listaClientes;       
    }
    
    /**
     * ESTE METODO DEVUELVE UNA LISTA CON TODOS LOS ARTICULOS DE LA BASE DE DATOS
     * @return List<Articulos>
     */
    public List<Articulos> getArticulos()//METODO PROBADO, FUNCIONA CORRECTAMENTE
    {
        List<Articulos> listaArticulos;
        iniciarConexionConBBDD();
        listaArticulos=sesion.createQuery("FROM Articulos").list();
        sesion.close();
        
        return listaArticulos;
    }
    
    /**
     * ESTE METODO DEVUELVE EL CODIGO MAXIMO DE LA TABLA PEDIDO
     * @return numero maximo pedido
     */
    public Integer numNuevoPedido()
    {
        Integer numPedido;
        
        iniciarConexionConBBDD();
        numPedido=(Integer)sesion.createQuery("SELECT MAX(codPedido) FROM Pedido").uniqueResult();
        sesion.close();
        return numPedido;
    }
    
    /**
     * INSERTA EN LA BASE DE DATOS UNA LINEA DE PEDIDO
     * @param pedidoPadre PEDIDO QUE RELACIONAREMOS CON LA LINEA
     * @param lineaInsertar LINEA QUE QUEREMOS INSERTAR,INSTANCIADA PREVIAMENTE
     */
    public void addLineaPedido(Pedido pedidoPadre,Lineasped lineaInsertar)
    {
        iniciarConexionConBBDD();
        pedidoPadre.addLinea(lineaInsertar);
        sesion.update(pedidoPadre);
        transaccion.commit();
        sesion.close();    
    }
    
    /**
     * INSERTA EN LA BASE DE DATOS UN PEDIDO
     * @param pedidoInsertar PEDIDO QUE QUEREMOS INSERTAR,INSTANCIADO PREVIAMENTE
     */
    public void addPedido(Pedido pedidoInsertar)
    {
        iniciarConexionConBBDD();
        sesion.save(pedidoInsertar);
        transaccion.commit();
        sesion.close();     
    }
        
    /**
     * ESTE METODO DEVUELVE UNA LISTA CON TODOS LOS CODIGOS DE PEDIDO
     * @return List<Integer>
     */
    public List<Integer> getCodigosPedidos()
    {
        List<Integer> listaDeCodigos;
        iniciarConexionConBBDD();
        listaDeCodigos=sesion.createQuery("SELECT codPedido FROM Pedido").list();
        sesion.close();
        
        return listaDeCodigos;
    }
    
    /**
     * ESTE METODO DEVUELVE UN PEDIDO A TRAVES DE UN CODIGO
     * @param codPedido CODIGO DEL PEDIDO QUE QUEREMOS BUSCAR
     * @return Pedido SOLICITADO
     */
    public List<Pedido> getPedidoporCodigo(Integer codPedido)
    {
        List<Pedido> pedidoEncontrado;
        iniciarConexionConBBDD();
        pedidoEncontrado=sesion.createQuery("FROM Pedido WHERE codPedido="+codPedido).list();
        sesion.close();
        
        return pedidoEncontrado;
    }
    
    
    /**
     * ESTE METODO DEVUELVE UNA LISTA DE PEDIDOS EN FUNCION DEL ESTADO
     * @param estado NUMERO DE ESTADO, 1 PARA RECEPCIONADO, 0 PARA NO RECEPCIONADO
     * @return List<Pedido>
     */
    public List<Pedido> getPedidosPorEstado(Integer estado)
    {
        List<Pedido> listaPedidos;
        iniciarConexionConBBDD();
        listaPedidos=sesion.createQuery("FROM Pedido WHERE recepcionado="+estado).list();
        sesion.close();
        
        return listaPedidos;
    }
    
    /**
     * ESTE METODO DEVUELVE TODOS LOS PEDIDOS
     * @return List<Pedido>
     */
    public List<Pedido> getPedidos()
    {
        List<Pedido> listaPedidos;
        iniciarConexionConBBDD();
        listaPedidos=sesion.createQuery("FROM Pedido").list();
        sesion.close();
        
        return listaPedidos;
    }
    
    /**
     * ESTE METODO DEVUELVE UN PEDIDO POR CODIGO Y ESTADO
     * @param codPedido numero del pedido
     * @param Estado estado del pedido
     * @return list<Pedido>
     */
    public List<Pedido> getPedidoPorCodYEstado(Integer codPedido, Integer Estado)
    {
        List<Pedido> pedidoEncontrado;
        iniciarConexionConBBDD();
        pedidoEncontrado=sesion.createQuery("FROM Pedido WHERE codPedido="+codPedido+" AND recepcionado="+Estado).list();
        sesion.close();
        
        return pedidoEncontrado;
    }
    /**
     * ESTE METODO MODIFICA EL CAMPO RECEPCIONADO DE LA BASE DE DATOS
     * @param codPedido CODIGO DEL PEDIDO A RECEPCIONAR
     */
    public void recepcionarPedido(int codPedido)
    {
        iniciarConexionConBBDD();
        sesion.createQuery("UPDATE Pedido SET recepcionado=1 WHERE codPedido="+codPedido).executeUpdate();
        transaccion.commit();
        sesion.close();
        
    }
    
    /**
     * ESTE METODO ELIMINA UN PEDIDO Y TODOS LOS REGISTROS RELACIONADOS CON EL
     * @param pedidoEliminar pedido que se quiere eliminar
     */
    public void removePedido(Pedido pedidoEliminar)
    {
        iniciarConexionConBBDD();
        sesion.delete(pedidoEliminar);
        transaccion.commit();
        sesion.close();
        
    }
    
   
    /**
     * ESTE METODO MODIFICA UN PEDIDO Y TODOS LOS REGISTROS RELACIONADOS CON EL
     * @param pedidoModificar pedido que se quiere modificar
     */
    public void updatePedido(Pedido pedidoModificar)
    {
        iniciarConexionConBBDD();
        sesion.update(pedidoModificar);
        transaccion.commit();
        sesion.close();
    }
    
   
    
}
